Description:
Apple 在 WWDC 2017 中發佈了 Vision 這個新的 framework,本篇來實作裡面的臉部偵測功能。
Component:
Highlight function:
在實作 Vision framework 中物件偵測時基本上分成三個步驟,分別是:
Requests 及 Handlers 實作方法如下:
let detectRequest = VNDetectFaceRectanglesRequest(completionHandler: self.handleFaces)
let detectRequestHandler = VNImageRequestHandler(cgImage: (testImg?.cgImage)!, options: [ : ])
宣告好 handler 後讓 handler 開始進行偵測的方式是呼叫該物件之 perform method。
try detectRequestHandler.perform([detectRequest])
執行完 handler 後會得到 observations 在這邊也就是人臉。
因之前已在宣告在執行完 Request 後就呼叫 handleFaces()。此 function 的功能為判斷是否有偵測到人臉,如果有就標示出人臉沒有的話就無動作。
func handleFaces(request: VNRequest, error: Error?) {
guard let faceDetectResults = request.results as? [VNFaceObservation] else {
fatalError("Unexpected result type from VNDetectFaceRetanglesRequest.")
}
if faceDetectResults.count == 0 {
print("No face detect.")
return
}
self.addSharpToFace(forObservations: faceDetectResults)
}
Additional:
在取得偵測結果時,每個 Observations 裡面會有 boundingBox property, 此 property 是指該偵測結果在原始圖片中的相對百分比位置,因此在繪製標示用的圖層時需額外進行座標轉換。
Reference:
Source code on Github